package com.juqimiao.raccoon.commodity.domain.category;

import com.juqimiao.raccoon.commodity.domain.reference.ReferenceValue;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * 商品属性配置的类。
 *
 * @author Collin Cai
 */
@Data
public class CommonPropConfig extends AbstractPropConfig {
    private static final long serialVersionUID = 44851099384837L;
    /**
     * 所属的属性值ID， 父属性值ID。
     */
    private String parentValueId;
    /**
     * 是否颜色属性。可选值:true(是),false(否)
     */
    private Boolean color;
    /**
     * 是否是可枚举属性, 有很多备选的值，通常会提供一个值的列表。
     * 可选值:true(是),false(否)
     */
    private Boolean enumerable;
    /**
     * 发布产品或商品时是否可以多选。可选值:true(是),false(否)
     */
    private Boolean multiple;
    /**
     * 在enum_prop是true的前提下，是否是卖家可以自行输入的属性
     * （注：如果enum_prop返回false，该参数统一返回false）。
     * 可选值:true(是),false(否)。
     * 对于品牌和型号属性（包括子属性）：如果用户是C卖家，
     * 则可自定义属性；如果是B卖家，则不可自定义属性，而必须要授权的属性。
     */
    private boolean input;

    private CommonPropConfig child;

    @Getter(AccessLevel.PUBLIC)
    @Setter(AccessLevel.PRIVATE)
    private List<CommonPropConfig> childPropValues = new ArrayList<>();

    private List<ReferenceValue> referenceValues = new ArrayList<>();

    public void setReferenceValues(List<ReferenceValue> referenceValues) {
        this.referenceValues = referenceValues;
        if (child != null) {
            fillChildPropValues();
        }
    }

    public void setChild(CommonPropConfig commonPropConfig) {
        if (referenceValues != null && referenceValues.size() > 0) {
            fillChildPropValues();
        }
    }

    /**
     * 子推荐值列表。当
     * 鞋类尺码：
     * 通码：
     * 165/80A
     * 170/84A
     * 175/88A
     * ...
     * 中国码：
     * S
     * M
     * L
     * ...
     * 欧码：
     * 46
     * 48
     * 50
     * 52
     * 英码：
     * 日码：
     * 均码：
     * 当前属性值对象，表示第一层。recommendedValues表示属于本属性值对象的子属性值集合。
     */
    private void fillChildPropValues() {
        referenceValues.forEach(value -> {
            final CommonPropConfig config = new CommonPropConfig();
            config.setParentValueId(value.getValueId());
            config.setReferenceValues(value.getChildValues());
            childPropValues.add(config);
        });
    }
}
